package wecom

import (
	"bytes"
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"v2/model"
)

// WeComNotifier 企业微信通知器
type WeComNotifier struct {
	WebhookURL string
}

// NewWeComNotifier 创建企业微信通知器
func NewWeComNotifier(webhookURL string) *WeComNotifier {
	return &WeComNotifier{WebhookURL: webhookURL}
}

// Send 发送消息到企业微信
func (w *WeComNotifier) Send(alert model.AlertInfo) error {
	// 检查是否有专门的卡片消息
	if cardMessage, ok := alert.TagsMap["card_message"]; ok && alert.Cate == "kube-event" {
		// 使用专门的 kube-event 卡片消息
		return w.sendCardMessage(cardMessage)
	}

	// 使用默认消息格式（保持原有逻辑）
	message := fmt.Sprintf(
		"%s\n\n规则名称: %s\n集群: %s\n严重级别: %s\n触发时间: %s\n触发值: %s\n分组名称: %s",
		alert.EmojiPrefix(),
		alert.RuleName,
		alert.Cluster,
		alert.SeverityText,
		alert.FormattedTime,
		alert.TriggerValue,
		alert.GroupName,
	)

	// 如果有标签，添加标签信息
	if len(alert.TagsMap) > 0 {
		message += "\n\n标签:\n"
		for k, v := range alert.TagsMap {
			// 跳过card_message标签，因为它不是普通标签
			if k != "card_message" {
				message += fmt.Sprintf("- %s: %s\n", k, v)
			}
		}
	}

	payload := map[string]interface{}{
		"msgtype": "text",
		"text": map[string]string{
			"content": message,
		},
	}

	return w.sendPayload(payload)
}

// sendCardMessage 发送卡片消息到企业微信
func (w *WeComNotifier) sendCardMessage(cardMessage string) error {
	// 直接使用字符串格式的卡片消息
	payload := map[string]interface{}{
		"msgtype": "text",
		"text": map[string]string{
			"content": cardMessage,
		},
	}

	return w.sendPayload(payload)
}

// sendPayload 发送负载到企业微信
func (w *WeComNotifier) sendPayload(payload map[string]interface{}) error {
	// 如果是文本消息且内容为空，添加默认内容
	if msgType, ok := payload["msgtype"].(string); ok && msgType == "text" {
		if text, ok := payload["text"].(map[string]interface{}); ok {
			if content, ok := text["content"].(string); ok && content == "" {
				text["content"] = "Kubernetes事件告警"
			}
		}
	}

	jsonData, err := json.Marshal(payload)
	if err != nil {
		return fmt.Errorf("序列化消息失败: %v", err)
	}

	log.Printf("📤 发送到企业微信: %s", string(jsonData))

	resp, err := http.Post(w.WebhookURL, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		return fmt.Errorf("发送请求失败: %v", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("发送失败，状态码: %d", resp.StatusCode)
	}

	// 检查响应内容
	var result map[string]interface{}
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return fmt.Errorf("解析响应失败: %v", err)
	}

	// 检查企业微信返回的错误码
	if errcode, ok := result["errcode"].(float64); ok && errcode != 0 {
		errmsg := "未知错误"
		if msg, ok := result["errmsg"].(string); ok {
			errmsg = msg
		}
		return fmt.Errorf("企业微信返回错误: %s", errmsg)
	}

	log.Printf("✅ 成功发送到企业微信")
	return nil
}
